package vip.websky.project.common.utils;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.binary.Hex;
import vip.websky.project.common.config.SysConst;

import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.concurrent.ThreadLocalRandom;

/**
 * @Author YangYong E-mail:yang2048@qq.com
 * @Create 2017/10/12-16:41
 **/
@Slf4j
public class EncodeUtils {
    /**
     * 将摘要信息转换为相应的编码
     * @param code 编码类型
     * @param message 摘要信息
     * @return 相应的编码字符串
     */
    private static String Encode(String code,String message){
        MessageDigest md;
        String encode = null;
        try {
            md = MessageDigest.getInstance(code);
            encode = Hex.encodeHexString(md.digest(message.getBytes(SysConst.SYS_CHARSET)));
        } catch (NoSuchAlgorithmException e) {
            log.error("异常信息:{}",e);
        } catch (UnsupportedEncodingException e) {
            log.error("异常信息:{}",e);
        }
        return encode;
    }

    /**
     * 将摘要信息转换成MD5编码
     * @param message 摘要信息
     * @return MD5编码之后的字符串 结果为小写
     */
    public static String md5Encode(String message){
        return Encode("MD5",message);
    }
    /**
     * 将摘要信息转换成SHA编码
     * @param message 摘要信息
     * @return SHA编码之后的字符串
     */
    public static String shaEncode(String message){
        return Encode("SHA",message);
    }
    /**
     * 将摘要信息转换成SHA-256编码
     * @param message 摘要信息
     * @return SHA-256编码之后的字符串
     */
    public static String sha256Encode(String message){
        return Encode("SHA-256", message);
    }
    /**
     * 将摘要信息转换成SHA-512编码
     * @param message 摘要信息
     * @return SHA-512编码之后的字符串
     */
    public static String sha512Encode(String message){
        return Encode("SHA-512", message);
    }


    public static String bytes2hex(byte[] bytes) {
        char[] cs = new char[bytes.length * 2];
        int i = 0;
        for (byte b: bytes) {
            int c = (b >> 4) & 15;
            cs[i++] = (char)(c > 9? 'A' + c - 10 : '0' + c);
            c = b & 15;
            cs[i++] = (char)(c > 9? 'A' + c - 10 : '0' + c);
        }
        return String.valueOf(cs);
    }

    public static String randomStr(int length) {
        ThreadLocalRandom rd = ThreadLocalRandom.current();
        byte[] bs = new byte[length/2];
        rd.nextBytes(bs);
        return bytes2hex(bs);
    }

    public static void main(String[] args) {
        System.out.println(Encode("sha-512","123"));
        System.out.println(sha512Encode("123"));
    }

}
